#ifndef PRODUCTDELEGATE_H
#define PRODUCTDELEGATE_H

#include <QStyledItemDelegate>
#include <QApplication>
#include <QDoubleSpinBox>
#include <QCheckBox>
#include <QComboBox>

// 自定义委托类，用于在视图中定制产品数据的显示和编辑方式
class ProductDelegate : public QStyledItemDelegate
{
    Q_OBJECT
public:
    // 构造函数，指定父对象
    explicit ProductDelegate(QObject *parent = nullptr);

    // 重写绘制函数，定义项目在视图中的显示样式
    void paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const override;

    // 重写编辑器事件处理函数
    bool editorEvent(QEvent *event, QAbstractItemModel *model,
                    const QStyleOptionViewItem &option, const QModelIndex &index) override;

    // 重写创建编辑器函数，根据列类型返回对应的编辑组件
    QWidget *createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const override;

    // 重写设置编辑器数据函数，将模型数据加载到编辑器
    void setEditorData(QWidget *editor, const QModelIndex &index) const override;

    // 重写设置模型数据函数，将编辑器数据保存到模型
    void setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const override;

    // 重写更新编辑器几何函数，设置编辑器的位置和大小
    void updateEditorGeometry(QWidget *editor, const QStyleOptionViewItem &option, const QModelIndex &index) const override;

private:
    // 判断是否为价格列
    bool isPriceColumn(int column) const;
    // 判断是否为折扣列
    bool isDiscountColumn(int column) const;
    // 判断是否为类别列
    bool isCategoryColumn(int column) const;
};

#endif // PRODUCTDELEGATE_H
